package main

import "fmt"

func main() {
	ifElseCondition()
	switchCondition()
	selectCondition()
}

func ifElseCondition() {
	var a int = 100
	if a < 20 {
		fmt.Println("a小于20")
	} else {
		fmt.Println("a大于20")
	}
	fmt.Printf("a的值为:%d\n", a)
}

func switchCondition() {
	var grade string
	var marks int = 90
	switch marks {
	case 90:
		grade = "A"
	case 80:
		grade = "B"
	case 70:
		grade = "C"

	default:
		grade = "D"
	}
	fmt.Printf("你考了%d你的等级是%s\n", marks, grade)

	//fallthrough会让下个判断忽略，直接判定为true
	switch {
	case false:
		fmt.Println("1 false")
	case true:
		fmt.Println("2 true ")
		fallthrough
	case false:
		fmt.Println("3 false fallthrough")
		fallthrough
	case true:
		fmt.Println("4 true fallthrough")
	case false:
		fmt.Println("5 false")
		fallthrough
	default:
		fmt.Println("6 default")

	}

}

/**
select 是 Go 中的一个控制结构，类似于用于通信的 switch 语句。每个 case 必须是一个通信操作，要么是发送要么是接收。

select 随机执行一个可运行的 case。如果没有 case 可运行，它将阻塞，直到有 case 可运行。一个默认的子句应该总是可运行的。
*/
func selectCondition() {
	var c1, c2, c3 chan int
	var i1, i2 int
	select {
	case i1 = <-c1:
		fmt.Printf("received ", i1, " from c1\n")
	case c2 <- i2:
		fmt.Printf("sent ", i2, " to c2\n")
	case i3, ok := (<-c3): // same as: i3, ok := <-c3
		if ok {
			fmt.Printf("received ", i3, " from c3\n")
		} else {
			fmt.Printf("c3 is closed\n")
		}
	default:
		fmt.Printf("no communication\n")
	}
}
